From 21c55f304394829230b4ae7d57e0476a8e6b47dc Mon Sep 17 00:00:00 2001 From: robertl Date: Wed, 12 Feb 2003 15:58:57 +0000 Subject: [PATCH] Mechanically hoist line parsing into function of its own. --- gpsbabel/xcsv.c | 252 +++++++++++++++++++++++++----------------------- 1 file changed, 129 insertions(+), 123 deletions(-) diff --git a/gpsbabel/xcsv.c b/gpsbabel/xcsv.c index 1edfcbf9d..f48e75a58 100644 --- a/gpsbabel/xcsv.c +++ b/gpsbabel/xcsv.c @@ -148,15 +148,140 @@ get_char_from_constant_table(char *key) } static void -xcsv_read_style(const char *fname) +xcsv_parse_style_line(const char *sbuff) { - char sbuff[8192]; int i, linecount = 0; - FILE *fp; char *s, *p, *sp; const char *cp; char *key, *val, *pfc; + /* + * tokens should be parsed longest to shortest, unless something + * requires a previously set value. This way something like + * SHORT and SHORTNAME don't collide. + */ + + /* whack off any comments */ + if ((p = strchr(sbuff, '#')) != NULL) + *p = '\0'; + + if (strlen(sbuff)) { + if (ISSTOKEN(sbuff, "FIELD_DELIMITER")) { + sp = csv_stringtrim(&sbuff[16], "\""); + cp = get_char_from_constant_table(sp); + if (cp) { + xcsv_file.field_delimiter = xstrdup(cp); + xfree(sp); + } + else + xcsv_file.field_delimiter = sp; + } else + + if (ISSTOKEN(sbuff, "RECORD_DELIMITER")) { + sp = csv_stringtrim(&sbuff[17], "\""); + cp = get_char_from_constant_table(sp); + if (cp) { + xcsv_file.record_delimiter = xstrdup(cp); + xfree(sp); + } + else + xcsv_file.field_delimiter = sp; + } else + + if (ISSTOKEN(sbuff, "BADCHARS")) { + sp = csv_stringtrim(&sbuff[9], "\""); + cp = get_char_from_constant_table(sp); + if (cp) { + xcsv_file.badchars = xstrdup(cp); + xfree(sp); + } + else + xcsv_file.badchars = sp; + } else + + if (ISSTOKEN(sbuff, "PROLOGUE")) { + xcsv_prologue_add(xstrdup(&sbuff[9])); + } else + + if (ISSTOKEN(sbuff, "EPILOGUE")) { + xcsv_epilogue_add(xstrdup(&sbuff[9])); + } else + + if (ISSTOKEN(sbuff, "IFIELD")) { + key = val = pfc = NULL; + + s = csv_lineparse(&sbuff[6], ",", "", linecount); + + i = 0; + while (s) { + switch(i) { + case 0: + /* key */ + key = csv_stringtrim(s, "\""); + break; + case 1: + /* default value */ + val = csv_stringtrim(s, "\""); + break; + case 2: + /* printf conversion */ + pfc = csv_stringtrim(s, "\""); + break; + default: + break; + } + i++; + + s = csv_lineparse(NULL, ",", "", linecount); + } + + xcsv_ifield_add(key, val, pfc); + + } else + + /* + * as OFIELDs are implemented as an after-thought, I'll + * leave this as it's own parsing for now. We could + * change the world on ifield vs ofield format later.. + */ + if (ISSTOKEN(sbuff, "OFIELD")) { + key = val = pfc = NULL; + + s = csv_lineparse(&sbuff[6], ",", "", linecount); + + i = 0; + while (s) { + switch(i) { + case 0: + /* key */ + key = csv_stringtrim(s, "\""); + break; + case 1: + /* default value */ + val = csv_stringtrim(s, "\""); + break; + case 2: + /* printf conversion */ + pfc = csv_stringtrim(s, "\""); + break; + default: + break; + } + i++; + s = csv_lineparse(NULL, ",", "", linecount); + } + + xcsv_ofield_add(key, val, pfc); + } + } +} + +static void +xcsv_read_style(const char *fname) +{ + char sbuff[8192]; + FILE *fp; + xcsv_file_init(); fp = fopen(fname, "r"); @@ -168,126 +293,7 @@ xcsv_read_style(const char *fname) memset(sbuff, '\0', sizeof(sbuff)); fgets(sbuff, sizeof(sbuff), fp); rtrim(sbuff); - - /* - * tokens should be parsed longest to shortest, unless something - * requires a previously set value. This way something like - * SHORT and SHORTNAME don't collide. - */ - - /* whack off any comments */ - if ((p = strchr(sbuff, '#')) != NULL) - *p = '\0'; - - if (strlen(sbuff)) { - if (ISSTOKEN(sbuff, "FIELD_DELIMITER")) { - sp = csv_stringtrim(&sbuff[16], "\""); - cp = get_char_from_constant_table(sp); - if (cp) { - xcsv_file.field_delimiter = xstrdup(cp); - xfree(sp); - } - else - xcsv_file.field_delimiter = sp; - } else - - if (ISSTOKEN(sbuff, "RECORD_DELIMITER")) { - sp = csv_stringtrim(&sbuff[17], "\""); - cp = get_char_from_constant_table(sp); - if (cp) { - xcsv_file.record_delimiter = xstrdup(cp); - xfree(sp); - } - else - xcsv_file.field_delimiter = sp; - } else - - if (ISSTOKEN(sbuff, "BADCHARS")) { - sp = csv_stringtrim(&sbuff[9], "\""); - cp = get_char_from_constant_table(sp); - if (cp) { - xcsv_file.badchars = xstrdup(cp); - xfree(sp); - } - else - xcsv_file.badchars = sp; - } else - - if (ISSTOKEN(sbuff, "PROLOGUE")) { - xcsv_prologue_add(xstrdup(&sbuff[9])); - } else - - if (ISSTOKEN(sbuff, "EPILOGUE")) { - xcsv_epilogue_add(xstrdup(&sbuff[9])); - } else - - if (ISSTOKEN(sbuff, "IFIELD")) { - key = val = pfc = NULL; - - s = csv_lineparse(&sbuff[6], ",", "", linecount); - - i = 0; - while (s) { - switch(i) { - case 0: - /* key */ - key = csv_stringtrim(s, "\""); - break; - case 1: - /* default value */ - val = csv_stringtrim(s, "\""); - break; - case 2: - /* printf conversion */ - pfc = csv_stringtrim(s, "\""); - break; - default: - break; - } - i++; - - s = csv_lineparse(NULL, ",", "", linecount); - } - - xcsv_ifield_add(key, val, pfc); - - } else - - /* - * as OFIELDs are implemented as an after-thought, I'll - * leave this as it's own parsing for now. We could - * change the world on ifield vs ofield format later.. - */ - if (ISSTOKEN(sbuff, "OFIELD")) { - key = val = pfc = NULL; - - s = csv_lineparse(&sbuff[6], ",", "", linecount); - - i = 0; - while (s) { - switch(i) { - case 0: - /* key */ - key = csv_stringtrim(s, "\""); - break; - case 1: - /* default value */ - val = csv_stringtrim(s, "\""); - break; - case 2: - /* printf conversion */ - pfc = csv_stringtrim(s, "\""); - break; - default: - break; - } - i++; - s = csv_lineparse(NULL, ",", "", linecount); - } - - xcsv_ofield_add(key, val, pfc); - } - } + xcsv_parse_style_line(sbuff); } while (!feof(fp)); /* if we have no output fields, use input fields as output fields */ -- 2.30.2